home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / SELECTMO.I < prev    next >
Text File  |  1991-12-14  |  57KB  |  1,721 lines

  1. IMPLEMENTATION MODULE SelectModule;
  2.  
  3. (*
  4.   Letzte Änderung am 04/02/91: BringSelectionFront mit ...Back
  5.   ausgetauscht, da im weiteren bei Select im Punktmodus nunmehr
  6.   nicht mehr das erste sondern das letzte passende Objekt in der
  7.   Liste angewählt wird.
  8. *)
  9. IMPORT CommonData;
  10. IMPORT mtAlerts;
  11. IMPORT MagicAES;
  12. IMPORT MagicSys;
  13. IMPORT Variablen;
  14. IMPORT MathLib0;
  15. FROM Diverses        IMPORT round, NumAlert, min, max;
  16. FROM Types           IMPORT ExtendedArraySize, ObjectPtrTyp, CodeAryTyp,
  17.                             DrawObjectTyp, TextPosTyp;
  18. FROM OwnBoxes        IMPORT GetMKState, ChangeBox, SetMousePos,
  19.                             MyGrafRubberBox, MyGrafDragBox;
  20. FROM ObjectUtilities IMPORT ShowSelectRects, Redraw, ShowSelection;
  21. FROM SYSTEM          IMPORT ADR, ADDRESS;
  22. FROM Storage         IMPORT ALLOCATE, DEALLOCATE;
  23. IMPORT Bezier, Circles, Epic, Lines, TextBox, Undo;
  24.  
  25.  
  26. (**
  27. IMPORT Debug;
  28. IMPORT RTD;
  29. **)
  30.  
  31. TYPE   MoveCopyProc = PROCEDURE ( INTEGER, INTEGER );
  32.        ChangeProc   = PROCEDURE ( ObjectPtrTyp,
  33.                                   LONGREAL, LONGREAL);
  34. VAR ChangeProcedures : ARRAY DrawObjectTyp OF ChangeProc;
  35.     (* Sollen Dreh- oder Spiegel-Operationen intern aufgerufen werden,
  36.        so wird InternalFlag auf TRUE gesetzt. Damit wird dann ein
  37.        Redraw in den Subroutinen unterbunden... *)
  38.     InternalFlag  : BOOLEAN;
  39.     AllObjects    : BOOLEAN; (* Flag wird nur von ChangeAll gesetzt *)
  40.  
  41.  
  42. PROCEDURE ChangePic(obj    : ObjectPtrTyp;
  43.                     dx, dy : LONGREAL);
  44. VAR tmp    : ObjectPtrTyp;
  45.     xo, yo : INTEGER;
  46. BEGIN
  47.   xo := 0;
  48.   yo := 0;
  49.   tmp := obj^.Children;
  50.   WHILE tmp<>NIL DO
  51.     IF AllObjects OR (tmp^.Selected AND NOT tmp^.Locked) THEN
  52.       ChangeProcedures[VAL(DrawObjectTyp, tmp^.Code[0])](tmp, dx, dy);
  53.       (* Jetzt korrigiere Koordinaten *)
  54.       IF dx<>0.0 THEN
  55.         tmp^.Code[1] := xo + round(MathLib0.real(tmp^.Code[1] - xo) * dx);
  56.         tmp^.Surround[0] := xo + round(MathLib0.real(tmp^.Surround[0] - xo) * dx);
  57.         tmp^.Surround[2] := round(MathLib0.real(tmp^.Surround[2]) * dx);
  58.       END;
  59.       IF dy<>0.0 THEN
  60.         tmp^.Code[2] := yo + round(MathLib0.real(tmp^.Code[2] - yo) * dy);
  61.         tmp^.Surround[1] := yo + round(MathLib0.real(tmp^.Surround[1] - yo) * dy);
  62.         tmp^.Surround[3] := round(MathLib0.real(tmp^.Surround[3]) * dy);
  63.       END;
  64.     END;
  65.     tmp := tmp^.Next;
  66.   END;
  67.   IF dx<>0.0 THEN
  68.     obj^.Code[3] := round(MathLib0.real(obj^.Code[3]) * dx);
  69.   END;
  70.   IF dy<>0.0 THEN
  71.     obj^.Code[4] := round(MathLib0.real(obj^.Code[4]) * dy);
  72.   END;
  73.   obj^.SurrDirty := TRUE;
  74. END ChangePic;
  75.  
  76. PROCEDURE ChangeIt(dx, dy : LONGREAL; xo, yo : INTEGER);
  77. VAR tmp    : ObjectPtrTyp;
  78. BEGIN
  79.   tmp := Variablen.FirstObject^.Next;
  80.   WHILE tmp<>NIL DO
  81.     IF AllObjects OR (tmp^.Selected AND NOT tmp^.Locked) THEN
  82.       ChangeProcedures[VAL(DrawObjectTyp, tmp^.Code[0])](tmp, dx, dy);
  83.       (* Jetzt korrigiere Koordinaten *)
  84.       IF dx<>0.0 THEN
  85.         tmp^.Code[1] := xo + round(MathLib0.real(tmp^.Code[1] - xo) * dx);
  86.         tmp^.Surround[0] := xo + round(MathLib0.real(tmp^.Surround[0] - xo) * dx);
  87.         tmp^.Surround[2] := round(MathLib0.real(tmp^.Surround[2]) * dx);
  88.       END;
  89.       IF dy<>0.0 THEN
  90.         tmp^.Code[2] := yo + round(MathLib0.real(tmp^.Code[2] - yo) * dy);
  91.         tmp^.Surround[1] := yo + round(MathLib0.real(tmp^.Surround[1] - yo) * dy);
  92.         tmp^.Surround[3] := round(MathLib0.real(tmp^.Surround[3]) * dy);
  93.       END;
  94.     END;
  95.     tmp := tmp^.Next;
  96.   END;
  97. END ChangeIt;
  98.  
  99. PROCEDURE ChangeAll(dx, dy : LONGREAL; xo, yo : INTEGER);
  100. VAR tmp    : ObjectPtrTyp;
  101. BEGIN
  102.   AllObjects := TRUE;
  103.   ChangeIt(dx, dy, xo, yo);
  104.   AllObjects := FALSE;
  105. END ChangeAll;
  106.  
  107. (* ---------------------------- *)
  108.  
  109. PROCEDURE SelObs (all : BOOLEAN) : CARDINAL;
  110. VAR res : CARDINAL;
  111.     obj : ObjectPtrTyp;
  112. BEGIN
  113.   res := 0;
  114.   obj := Variablen.FirstObject^.Next;
  115.   WHILE obj<>NIL DO
  116.     IF obj^.Selected THEN
  117.       IF all OR NOT obj^.Locked THEN
  118.         INC(res, 1);
  119.       END;
  120.     END;
  121.     obj := obj^.Next;
  122.   END;
  123.   RETURN res;
  124. END SelObs;
  125.  
  126. (* ---------------------------- *)
  127.  
  128. PROCEDURE SelPics (all : BOOLEAN) : CARDINAL;
  129. VAR res : CARDINAL;
  130.     obj : ObjectPtrTyp;
  131. BEGIN
  132.   res := 0;
  133.   obj := Variablen.FirstObject^.Next;
  134.   WHILE obj<>NIL DO
  135.     IF obj^.Selected AND (ORD(obj^.Code[0])=ORD(Picture)) THEN
  136.       IF all OR NOT obj^.Locked THEN
  137.         INC(res, 1);
  138.       END;
  139.     END;
  140.     obj := obj^.Next;
  141.   END;
  142.   RETURN res;
  143. END SelPics;
  144.  
  145. (* ---------------------------- *)
  146.  
  147. PROCEDURE DeleteSelection ;
  148. (* neu geschrieben wegen Lock *)
  149. VAR o1, o2 : ObjectPtrTyp;
  150. BEGIN
  151.   IF SelObs(FALSE)>0 THEN
  152.     Undo.PrepareUndo(TRUE);
  153.     ChainOut(o1, TRUE);
  154.     o2 := o1;
  155.     WHILE o2<>NIL DO
  156.       o1 := o2^.Next;
  157.       Variablen.DeleteObject(o2);
  158.       o2 := o1;
  159.     END;
  160.   END;
  161. END DeleteSelection;
  162.  
  163. (* ---------------------------- *)
  164.  
  165. PROCEDURE CopySelection(DX, DY : INTEGER);
  166. VAR dx, dy : INTEGER;
  167.     obj : ObjectPtrTyp;
  168.     dum : INTEGER;
  169.  
  170.     PROCEDURE CreateTreeCopy(    source : ObjectPtrTyp;
  171.                              VAR dest   : ObjectPtrTyp);
  172.     VAR obj, destend, last : ObjectPtrTyp;
  173.     BEGIN
  174.       last    := Variablen.LastObject;
  175.       destend := dest;
  176.       obj     := source;
  177.       WHILE obj<>NIL DO
  178.         Variablen.NewObject(obj^.Code, obj^.CPtr, obj^.EPtr, obj^.Surround);
  179.         IF destend = NIL THEN
  180.           dest    := Variablen.LastObject;
  181.           destend := Variablen.LastObject;
  182.          ELSE
  183.           destend^.Next := Variablen.LastObject;
  184.           destend := destend^.Next;
  185.         END;
  186.         IF (ORD(obj^.Code[0]) = ORD(Picture)) AND (obj^.Children<>NIL) THEN
  187.           CreateTreeCopy(obj^.Children, destend^.Children);
  188.         END;
  189.         obj := obj^.Next;
  190.         Variablen.LastObject       := last;
  191.         Variablen.LastObject^.Next := NIL;
  192.       END;
  193.     END CreateTreeCopy;
  194.  
  195. BEGIN
  196.   IF (DX=0) AND (DY=0) THEN
  197. (**
  198.     dum := Alert ( 2, Warning);
  199. **)
  200.     dum := NumAlert ( 14, 2);
  201.    ELSE
  202.     dum := 1;
  203.   END;
  204.   IF dum=1 THEN
  205.     (*
  206.        Wir bedienen uns eines kleinen Tricks damit sich hinterher die
  207.        Selektion wieder am Ort der Maus befindet: Wir verschieben die
  208.        Selektion an die neue Stelle und erzeugen eine Kopie an der alten.
  209.     *)
  210.     dx := - DX;
  211.     dy := - DY;
  212.     MoveSelection(DX, DY);
  213.     obj := Variablen.FirstObject^.Next;
  214.     WHILE obj<>NIL DO
  215.       IF obj^.Selected THEN
  216.         Variablen.NewObject(obj^.Code, obj^.CPtr, obj^.EPtr, obj^.Surround);
  217.         Variablen.LastObject^.Code[1]     := Variablen.LastObject^.Code[1] + dx;
  218.         Variablen.LastObject^.Code[2]     := Variablen.LastObject^.Code[2] + dy;
  219.         Variablen.LastObject^.Surround[0] := Variablen.LastObject^.Surround[0] + dx;
  220.         Variablen.LastObject^.Surround[1] := Variablen.LastObject^.Surround[1] + dy;
  221.         (* Jetzt der Sonderfall eines Subpictures *)
  222.         IF (ORD(obj^.Code[0]) = ORD(Picture)) AND (obj^.Children<>NIL) THEN
  223.           CreateTreeCopy(obj^.Children, Variablen.LastObject^.Children);
  224.         END;
  225.       END;
  226.       obj := obj^.Next;
  227.     END;
  228.   END;
  229. END CopySelection;
  230.  
  231. (* ---------------------------- *)
  232.  
  233. PROCEDURE MoveSelection(dx, dy : INTEGER);
  234.  
  235.   PROCEDURE MoveEm(Start  : ObjectPtrTyp;
  236.                    dx, dy : INTEGER;
  237.                    Change : BOOLEAN);
  238.   VAR obj  : ObjectPtrTyp;
  239.   BEGIN
  240.     obj := Start;
  241.     WHILE obj<>NIL DO
  242.       IF obj^.Selected AND NOT obj^.Locked THEN
  243.         IF Change THEN
  244.           obj^.Code[1]     := obj^.Code[1] + dx;
  245.           obj^.Code[2]     := obj^.Code[2] + dy;
  246.         END;
  247.         obj^.Surround[0] := obj^.Surround[0] + dx;
  248.         obj^.Surround[1] := obj^.Surround[1] + dy;
  249. (**
  250.         obj^.SurrDirty   := TRUE;
  251. **)
  252.         IF ORD(obj^.Code[0]) = ORD(Picture) THEN
  253.           MoveEm(obj^.Children, dx, dy, FALSE);
  254.         END;
  255.       END;
  256.       obj := obj^.Next;
  257.     END;
  258.   END MoveEm;
  259.  
  260. BEGIN
  261.   MoveEm(Variablen.FirstObject^.Next, dx, dy, TRUE);
  262. END MoveSelection;
  263.  
  264. (* ---------------------------- *)
  265.  
  266. PROCEDURE DeselectT